perm filename TLKELF.FAI[AL,HE] blob sn#209223 filedate 1977-02-21 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00005 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	TITLE TLKELF
C00006 00003	START OF EXECUTABLE CODE
C00009 00004		[CONTINUATION OF "TLKELF"]
C00013 00005		[LOCAL STORAGE AREA]
C00016 ENDMK
C⊗;
TITLE TLKELF
INTERNAL TLKELF

;"TLKELF" IS A SAIL CALLABLE PROCEDURE FOR SENDING A COMMAND INSTRUCTION
;BLOCK FROM THE PDP10 TO THE PDP11.  THE INSTRUCTION BLOCK CONTAINS THE
;INFORMATION NECESSARY TO DRIVE ONE ARM JOINT.  IN ADDITION, IF DYNAMIC
;RESPONSE DATA IS TO BE SEND FROM THE ELF TO THE TEN, "TLKELF" COLLECTS
;THE DATA BEFORE EXITING.  A SAMPLE SAIL CALL FOLLOWS:
;
;	RUN←TLKELF(ARM,JOINT,DCOFF,AMP,CYCLE,DURA,TP,MASTER,GRF,DATA);
;WHERE
;	RUN   = 0 INDICATES MOVEMENT INITIATED, 1 INDICATES FAILURE
;	ARM   = 0 FOR YELLOW ARM, 1 FOR BLUE
;	JOINT = 1 TO 6
;	DCOFF = -128 TO 128, DC STEP OFFSET
;	AMP   = -128 TO 128, MAXIMUM SINUSOIDAL MOTOR DRIVE
;	CYCLE = 1 TO 32000, PERIOD OF SINUSOID
;	DURA  = 1 TO 32000, DURATION OF MOTOR DRIVE
;	TP    = 0 INDICATES POT TO BE READ, 1 FOR TACHOMETER
;	MASTER= CHECK WORD TO ELF TO INSURE THIS IS A LEGAL INSTRUCTION
;	GRF   = 1 INDICATES DYNAMIC RESPONSE DATA TO BE SEND BACK FOR GRAPHING
;		0 INDICATES NO GRAPHICS
;	DATA  = ARRAY TO RETURN DYNAMIC RESPONSE DATA
;
;TLKELF EXPECTS THE "ARM" VALUE IN THE ELF TO BE NEGATIVE INDICATING THAT THE
;ELF IS PREPARED TO RECEIVE A COMMAND BLOCK.  IF "ARM" IS NOT NEGATIVE AN ERROR
;MESSAGE IS TYPED AND TLKELF EXITS TO THE CALLING PROGRAM.  AFTER PASSING THE
;CONTROL BLOCK, TLKELF GOES INTO A WAIT LOOP LOOKING FOR "ARM" TO GO NEGATIVE
;IN THE ELF INDICATING THAT THE ARM MOTION IS COMPLETED.  IF TLKELF IS IN A WAIT
;LOOP FOR OVER 60 SECONDS, AN ERROR MESSAGE IS TYPED.  IF THE "ELF" COMPLETES
;A MOTION SUCCESSFULLY, TLKELF CHECKS THE VALUE OF GRF TO DETERMINE IF DYNAMIC
;RESPONSE DATA IS TO BE COLLECTED.  IF GRF IS TRUE, THE ARRAY DATA IS FILLED
;WITH 3000 WORDS FROM THE ELF.  AFTER EXECUTION OF TLKELF, THE ELF IS LEFT IN A
;WAIT LOOP LOOKING FOR ANOTHER COMMAND BLOCK.

;DEFINITIONS

P←17		;PUSH STACK REGISTER
CMDADD←37500	;COMMAND BUFFER (WORD) ADDRESS IN ELF
DRADD←37540	;DYNAMIC RESPONSE BUFFER (WORD) ADDRESS IN ELF

;START OF EXECUTABLE CODE

TLKELF:	SETZ	1,		;CLEAR ERROR FLAG
       	MOVEM	16,HOLD+16	;SAVE THE REGISTERS
	HRRZI	16,HOLD
	BLT	16,HOLD+15
	MOVE	1,P		;GET THE ADDRESS OF THE STACK
	SUBI	1,=10		;GET THE ADDRESS OF "ARM" NUMBER
	HRLZ	1,1		;PREPARE TO BLT INTO LOCAL ARRAY
	HRRI	1,CMDARR	;STORE ARGUMENTS IN CMDARR
	BLT	1,CMDARR+11	;TRANSFER ARGUMENTS
	SOS	2,DATA		;DECREMENT ARRAY POINTER
	HRLI	2,-=3000	;SET POINTER TO TRANSFER 3000 WORDS INTO DATA
	MOVEM	2,INLST
	IOPUSH	1,		;CALLER MIGHT WANT THIS CHANNEL
	JRST	[   OUTSTR CM0	;IOPDLOV MESSAGE
		    JRST   ERR  ]
	INIT	1,17  		;INITIALIZE THE ELF
	SIXBIT	/ELF/
	0
	JRST	[   OUTSTR CM1		;ERROR RETURN
ERR:		    AOS    HOLD+1	;RETURN ERROR VALUE
		    JRST   TLKDNE  ]
	GETSTS	1,1		;GET THE ELF STATUS WORD
	TRNE	1,777700	;CHECK FOR ERROR CONDITION
	JRST	[   OUTSTR CM2		;INDICATE STATUS ERROR
		    JRST   ERR    ]
	
;CHECK IF ELF IS READY TO RECEIVE A COMMAND BLOCK

	MTAPE	1,ARMADD	;GET THE VALUE OF "ARM" WORD IN ELF
	JRST	[   OUTSTR CM3		;ERROR RETURN
		    JRST   ERR  ]
	MOVE	2,ARM		;LOAD VALUE INTO REGISTER
	JUMPGE	2,[ OUTSTR CM4	;ELF NOT READY FOR COMMAND IF ARM GE 0
		    JRST   ERR  ]

;SEND COMMAND BLOCK TO "ELF"

	USETO	1,CMDMDE	;SET UP OUTPUT OF COMMAND BLOCK
	OUT	1,OUTLST	;SEND THE COMMAND LIST TO THE ELF
	JRST	.+2		;NORMAL RETURN
	JRST	[   OUTSTR CM5		;ERROR RETURN
		    JRST   ERR  ]

;GO INTO WAIT LOOP UNTIL TASK DONE

	MOVEI	=30		;SET WAIT LOOP COUNT
	MOVEM	CNT
SLEP:	MOVEI	2,1		;SET PROGRAM TO SLEEP FOR 1 SECOND
     	SLEEP	2,
;	[CONTINUATION OF "TLKELF"]

	MTAPE	1,ARMADD	;GET THE VALUE OF "ARM" WORD IN ELF
	JRST	[   OUTSTR COM6		;ERROR RETURN
		    JRST   ERR  ]
	MOVN	1,ARM		;LOAD VALUE INTO REGISTER
	JUMPG 	1,DVEDNE	;IF "ARM" VALUE NEGATIVE, BRANCH, MOTOR DRIVE DONE
	SOSE	CNT		;SKIP IF ELF TAKES TOO MUCH TIME
	JRST	SLEP		;ELSE GO SLEEP AGAIN
	OUTSTR  COM7		;TELL OPERATOR, ELF TOOK TOO MUCH TIME
	JRST    ERR  
	
;MOTOR DRIVE FUNCTION COMPLETED. EXIT OR COLLECT RESPONSE DATA

DVEDNE:	CAIN	1,2		;CHECK IF ERROR CODE TWO RETURNED
	JRST	[   OUTSTR COM9		;TYPE MASTER NUMBER ERROR
		    JRST   ERR  ]
	CAIN	1,3		;CHECK IF PANIC BUTTON HIT
	JRST	[   OUTSTR COM10	;TYPE ERROR MESSAGE
		    JRST   ERR  ]
	CAIN	1,4		;CHECK IF JOINT STARTING OUT OF RANGE
 	JRST	[   OUTSTR COM11	;TYPE ERROR MESSAGE
		    JRST   ERR  ]
       	SKIPG	GRF		;SKIP IF DYNAMIC RESPONSE DATA REQUESTED
	JRST	TLKDNE		;ELSE GO TO EXIT SEQUENCE
	OR	1,[400004,,400000]	;ADD TRANSFER MODE BITS
	MOVEM	1,DYNA
     	USETI	1,DYNA  	;SET UP INPUT OF D.R. DATA BLOCKS
     	IN	1,INLST		;READ IN A BLOCK OF DATA
	JRST	.+2		;NORMAL RETURN
	JRST	[   OUTSTR COM8		;ERROR RETURN
		    JRST   ERR  ]

;RETURN TO CALLING PROGRAM

TLKDNE:	IOPOP	1,		;RELEASE THE ELF & RESTORE CHANNEL 1
	JFCL			;JUST CANNOT HAPPEN
       	HRLZI	16,HOLD		;RESTORE THE REGISTERS
	BLT	16,16
	SUB	P,[13(13)]	;POP ARGUMENTS OFF STACK
	JRST	@13(P)		;RETURN


;END OF "TLKELF"
;	[LOCAL STORAGE AREA]

PT:	0
CNT:	0
HOLD:	BLOCK	17
INBUF:	BLOCK	3

;COMMAND DATA BLOCK

CMDARR:	0		;YELLOW OR BLUE ARM
	0		;JOINT
	0		;DC OFFSET
	0		;SINUSOID AMPLITUDE
	0		;SINUSOID PERIOD
	0		;MOTION DURATION
	0		;POT/TACH FLAG
	0		;MASTER NUMBER
GRF:	0		;GRAPHIC/DYNAMIC RESPONSE FLAG
DATA:	0		;ADDRESS OF DYNAMIC RESPONSE DATA ARRAY

;I/O DATA AREAS

ARMADD:	002004,,CMDADD	;MODE AND ADDRESS FOR COMMAND OUTPUT STRING
ARM:	0		;VALUE OF "ARM" LOCATION IN ELF

DYNA:	400004,,400000+DRADD	;MODE AND ADDRESS FOR "IN" OF DYNAMIC RESPONSE DATA

CMDMDE:	400004,,400000+CMDADD	;MODE AND ADDRESS FOR COMMAND OUTPUT STRING

OUTLST:	IOWD =8,CMDARR	;OUT COMMAND LIST
	0

INLST:	IOWD =3000,INBUF	;DYNAMIC RESPONSE INPUT LIST
	0

;OUTPUT STRINGS

CM0:	ASCIZ/IOPDLOV WHEN TRY TO SAVE CHANNEL 1 FOR "ELF"
/
CM1:	ASCIZ/CANNOT INIT "ELF"
/
CM2:	ASCIZ/"ELF" STATUS WORD INDICATES ERROR CONDITION
/
CM3:	ASCIZ/READING OF "ELF" READY FLAG FAILED
/
CM4:	ASCIZ/"ELF" NOT READY FOR ARM COMMAND
/
CM5:	ASCIZ/BAD TRANSFER OF COMMAND LIST TO "ELF"
/
COM6:	ASCIZ/BAD READ FROM "ELF" DURING MOTOR DRIVE WAIT LOOP
/
COM7:	ASCIZ/MOTOR DRIVE TOOK TOO LONG TO EXECUTE
/
COM8:	ASCIZ/BAD READ FROM "ELF" DURING GRAPHICS DATA TRANSFER
/
COM9:	ASCIZ/WRONG MASTER NUMBER SENT TO "ELF"
/
COM10:	ASCIZ/NO POWER TO ARM INTERFACE, PLEASE RESET
/
COM11:	ASCIZ/CAN'T MOVE, REQUESTED JOINT OUT OF RANGE
/

END